package com.daqsoft.service.project;

import com.daqsoft.dao.project.TaskDao;
import com.daqsoft.data.User;
import com.daqsoft.data.project.Task;
import com.daqsoft.dto.StatusEnum;
import com.daqsoft.dto.TaskTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 我的任务服务层
 * @author 周麟东 on 15:46
 */
@Service
public class MyTaskService {

    @Autowired
    private TaskDao taskDao;

    /**
     * 获取某个人的正在进行和等待进行的简单任务
     * @param user 哪个人
     * @param role 该人的角色 是负责人还是责任人
     * @return 任务列表
     */
    public List<Task> getSimpleTask(User user, String role) {
        List<Task> taskList = null;
        if (role.equals("principal")){
            taskList = taskDao.findTaskByPrincipal(user);
            taskList = taskList.stream().filter(task ->
                    (task.getStatus() == StatusEnum.WAIT ||
                            task.getStatus() == StatusEnum.PROCESS ||
                            task.getStatus() == StatusEnum.UNOPEN) && task.getType() == TaskTypeEnum.SIMPLE).collect(Collectors.toList());
        }
        if (role.equals("verifier")){
            taskList = taskDao.findTaskByVerifierAndStatus(user , StatusEnum.CHECK);
        }
        if (taskList == null){
            return null;
        }
        return hiddenTask(taskList);
    }

    /**
     * 获取某人已完成的任务
     * @param user 用户对象
     * @return 任务列表
     */
    public List<Task> getFinishTask(User user) {
        List<Task> pTasks = taskDao.findTaskByPrincipalAndStatus(user,StatusEnum.FINISH);
        List<Task> vTasks = taskDao.findTaskByVerifierAndStatus(user,StatusEnum.FINISH);
        for (Task vTask : vTasks) {
            if (vTask.getPrincipal().getId() != vTask.getVerifier().getId()){
                pTasks.add(vTask);
            }
        }
        return hiddenTask(pTasks);
    }

    /**
     * 获取某人未通过的任务
     * @param user 用户对象
     * @return 任务列表
     */
    public List<Task> getErrorTask(User user) {
        return hiddenTask(taskDao.findTaskByPrincipalAndStatus(user,StatusEnum.ERROR));
    }

    /**
     * 获取某人审核的变更任务
     * @param user 用户对象
     * @return 变更任务集合
     */
    public List<Task> getChangeTasks(User user) {
        List<Task> tasks =  taskDao.findByTypeAndPrincipal(TaskTypeEnum.CHANGE , user);
        tasks.addAll(taskDao.findByTypeAndPrincipal(TaskTypeEnum.CHANGE_CHECK, user));
        tasks = tasks.stream().filter(task -> task.getStatus()!=StatusEnum.ERROR && task.getStatus()!=StatusEnum.CHECKED).collect(Collectors.toList());
        return hiddenTask(tasks);
    }

    /**
     * 获取某人项目确认任务
     * @param user 用户对象
     * @return 任务列表
     */
    public List<Task> getProjectConfirm(User user) {
        List<Task> tasks = taskDao.findByTypeAndPrincipal(TaskTypeEnum.CONFIRM,user);
        tasks = tasks.stream().filter(task -> task.getStatus()!=StatusEnum.ERROR && task.getStatus()!=StatusEnum.CHECKED && task.getStatus()!=StatusEnum.FINISH).collect(Collectors.toList());
        return hiddenTask(tasks);
    }

    /**
     * 获取某人等待别人审核的任务
     * @param user 某人
     * @return 任务列表
     */
    public List<Task> getCheckTasks(User user) {
        return hiddenTask(taskDao.findTaskByPrincipalAndStatus(user , StatusEnum.CHECK));
    }

    /**
     * 获取已通过审核的任务
     * @param user 用户
     * @return 通过的任务
     */
    public List<Task> getCheckedTask(User user) {
        return hiddenTask(taskDao.findTaskByPrincipalAndStatus(user,StatusEnum.CHECKED));
    }

    private List<Task> hiddenTask(List<Task> tasks){
        return tasks.stream().filter(task -> task.getProject().getStatus() != StatusEnum.HIDDEN && task.getProject().getStatus() != StatusEnum.HIDDEN_CAN_CHANGE).collect(Collectors.toList());
    }
}
